8.2.1 跳过测试用例

代码清单8-3在同一个测试文件里包含了两个测试用例,第一个是前面已经介绍过的 TestDecode ,而另一个则是 TestEncode 。因为代码清单8-1中的程序并未实现相应的编码方法,所以 TestEncode 并没有做任何实际的行为。程序员在进行测试驱动开发(test-driven development, TDD)的时候,通常会让测试用例持续地失败,直到函数被真正地实现出来为止;但是,为了避免测试用例在函数尚未实现之前一直打印烦人的失败信息,用户也可以使用 testing.T 结构提供的 Skip 函数,暂时跳过指定的测试用例。此外,如果某个测试用例的执行时间非常长,我们也可以在实施完整性检查(sanity check)的时候,使用 Skip 函数跳过该测试用例。

除了可以直接跳过整个测试用例,用户还可以通过向 go test 命令传入短暂标志 -short ,并在测试用例中使用某些条件逻辑来跳过测试中的指定部分。注意,这种做法跟在 go test 命令中通过选项来选择性地执行指定的测试不一样:选择性执行只会执行指定的测试,并跳过其他所有测试,而 -short 标志则会根据用户编写测试代码的方式,跳过测试中的指定部分或者跳过整个测试用例。

作为例子,让我们来看一下如何通过 -short 标志来避免执行一个长时间运行的测试用例。首先,在 main_test.go文件 中导入 time 包,并创建一个新的测试用例:

func TestLongRunningTest(t *testing.T) {
 if testing.Short() {
  t.Skip("Skipping long-running test in short mode")
 }
 time.Sleep(10 * time.Second)
}

如果用户给定了 -short 标志,测试用例 TestLongRunningTest 将被跳过;相反,如果用户没有给定 -short 标志,那么 TestLongRunningTest 用例将被执行,并因此导致测试过程休眠10 s。现在,首先让我们来看一下测试用例在一般情况下是如何运行的:

=== RUN TestDecode
--- PASS: TestDecode (0.00s)
=== RUN TestEncode
--- SKIP: TestEncode (0.00s)
 main_test.go:24: Skipping encoding for now
=== RUN TestLongRunningTest
--- PASS: TestLongRunningTest (10.00s)
PASS
coverage: 46.7% of statements
ok  unit_testing 10.004s

正如我们所料,测试花了10 s来执行 TestLongRunningTest 测试用例。现在,我们使用以下命令再次运行测试:

go test –v –cover -short

这次运行测试将得出以下结果:

=== RUN TestDecode
--- PASS: TestDecode (0.00s)
=== RUN TestEncode
--- SKIP: TestEncode (0.00s)
 main_test.go:24: Skipping encoding for now
=== RUN TestLongRunningTest
--- SKIP: TestLongRunningTest (0.00s)
 main_test.go:29: Skipping long-running test in short mode
PASS
coverage: 46.7% of statements
ok  unit_testing 0.004s

正如结果所示,长时间运行的测试用例 TestLongRunningTest 在这次测试中被跳过了。

results matching ""

    No results matching ""